/*!
 * \file ParserYD.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief YD行情解析器头文件
 * 
 * \details 该文件定义了ParserYD类，是WonderTrader系统中用于接入YD（易达）行情服务器的核心组件：
 *          - 实现IParserApi接口，提供统一的行情解析服务
 *          - 继承YDListener，处理YD行情API回调事件
 *          - 支持实时期货行情数据接收和转换
 *          - 支持合约订阅和退订管理
 *          - 支持连接状态管理和登录认证
 *          - 专门针对YD（易达）交易系统的行情接入
 *          - 基于配置文件的参数管理方式
 *          - 提供完整的错误处理和日志记录功能
 *          - 支持YD API动态库加载和版本兼容性
 * 
 * \note YD是易达信息技术开发的期货交易系统平台，主要用于期货行情
 * \warning 使用前必须正确配置YD相关参数和配置文件
 */
#pragma once
#include "../Includes/IParserApi.h"
#include "../Share/DLLHelper.hpp"
#include "../API/yd1.108.360/ydApi.h"
#include <map>

NS_WTP_BEGIN
class WTSTickData;
NS_WTP_END

USING_NS_WTP;

/*!
 * \class ParserYD
 * \brief YD行情解析器类
 * 
 * \details ParserYD是WonderTrader系统中用于接入YD（易达）行情服务器的核心组件，主要功能包括：
 *          - YD行情连接管理：负责与YD行情服务器的连接、登录、断线重连等
 *          - 数据订阅管理：支持期货合约的批量订阅和退订
 *          - 行情数据转换：将YD原始行情数据转换为WonderTrader标准格式
 *          - 配置文件管理：基于YD配置文件的参数管理方式
 *          - 登录认证：支持用户名密码认证和监控模式
 *          - 错误处理：完善的错误检查和异常处理机制
 *          - 状态监控：连接状态监控、登录状态管理、API初始化状态跟踪
 *          - 动态库支持：支持不同版本的YD动态库加载
 *          - 异步处理：支持异步登录和数据订阅处理
 * 
 * \note 该类专门用于处理YD系统的期货行情数据，使用配置文件方式管理参数
 * \warning 使用前必须正确配置YD配置文件和用户认证信息
 * \see IParserApi YDListener
 */
class ParserYD :	public IParserApi, public YDListener
{
public:
	/*!
	 * \brief 构造函数
	 * 
	 * 初始化ParserYD实例，设置默认参数
	 */
	ParserYD();
	
	/*!
	 * \brief 析构函数
	 * 
	 * 清理资源，确保正确断开连接
	 */
	virtual ~ParserYD();


// YDListener 接口实现
public:
	/*!
	 * \brief 准备登录通知回调
	 * \param hasLoginFailed 是否曾经登录失败
	 * 
	 * \details 当YD API准备好进行登录时调用此方法：
	 *          - 表示与YD服务器的网络连接已建立
	 *          - 可以开始进行用户登录认证
	 *          - 触发WPE_Connect事件通知上层应用
	 *          - 自动调用DoLogin()执行登录操作
	 * 
	 * \note 这是YD连接流程的第一步，连接成功后的回调
	 */
	virtual void notifyReadyForLogin(bool hasLoginFailed) override;

	/*!
	 * \brief 登录结果通知回调
	 * \param errorNo 错误代码（0表示成功）
	 * \param maxOrderRef 最大订单引用号
	 * \param isMonitor 是否为监控模式
	 * 
	 * \details 处理YD用户登录结果：
	 *          - 登录成功：获取交易日期，触发WPE_Login事件，开始行情订阅
	 *          - 登录失败：记录错误信息和错误代码
	 *          - 支持监控模式和交易模式的区分
	 *          - 根据API初始化状态决定是否立即订阅行情
	 * 
	 * \note 登录成功后会根据API初始化状态自动调用DoSubscribe()
	 */
	virtual void notifyLogin(int errorNo, int maxOrderRef, bool isMonitor) override;

	/*!
	 * \brief API初始化完成通知回调
	 * 
	 * \details 当YD API完全初始化完成时调用：
	 *          - 表示所有合约信息已加载完毕
	 *          - 可以开始进行行情数据订阅
	 *          - 设置API初始化完成标志
	 *          - 自动调用DoSubscribe()开始订阅行情
	 * 
	 * \note 这是YD连接流程的最后一步，初始化完成后的回调
	 */
	virtual void notifyFinishInit(void) override;

	/*!
	 * \brief 行情数据通知回调
	 * \param pMarketData YD行情数据结构指针
	 * 
	 * \details 这是最核心的期货行情数据处理方法，功能包括：
	 *          - 期货合约信息验证：检查合约是否存在于基础数据中
	 *          - 交易所识别：从YD合约信息中获取交易所代码
	 *          - 时间处理：解析YD时间戳为日期和时间
	 *          - 数据转换：将YD行情数据转换为WonderTrader标准tick格式
	 *          - 价格数据：处理最新价、涨跌停价、昨收价、昨结算价
	 *          - 成交数据：处理成交量、成交额、持仓量
	 *          - 盘口数据：处理买卖一档价格和数量
	 *          - 期货特有字段：处理结算价、持仓量等期货专用数据
	 * 
	 * \note 支持期货行情数据的完整处理，包含期货特有的持仓量等字段
	 * \warning 必须确保m_pBaseDataMgr有效，否则无法处理行情数据
	 */
	virtual void notifyMarketData(const YDMarketData *pMarketData) override;

// IParserApi 接口实现
public:
	/*!
	 * \brief 初始化行情解析器
	 * \param config 配置参数对象
	 * \return 是否初始化成功
	 * 
	 * \details 从配置对象中读取以下参数：
	 *          - config: YD配置文件路径
	 *          - user: 用户名
	 *          - pass: 密码
	 *          - ydmodule: YD动态库模块名（默认：yd）
	 *          - 动态库加载：加载YD API动态库
	 *          - API创建：通过makeYDApi函数创建YD API实例
	 * 
	 * \note YD使用配置文件方式管理连接参数，与其他解析器不同
	 * \warning 必须确保YD配置文件存在且格式正确
	 */
	virtual bool init(WTSVariant* config) override;

	/*!
	 * \brief 释放资源
	 * 
	 * 断开连接并清理所有资源
	 */
	virtual void release() override;

	/*!
	 * \brief 建立连接
	 * \return 是否连接成功
	 * 
	 * 启动YD行情API，建立与服务器的连接
	 */
	virtual bool connect() override;

	/*!
	 * \brief 断开连接
	 * \return 是否断开成功
	 * 
	 * 断开与YD行情服务器的连接，清理API资源
	 */
	virtual bool disconnect() override;

	/*!
	 * \brief 检查连接状态
	 * \return 是否已连接
	 * 
	 * 返回当前与YD行情服务器的连接状态
	 */
	virtual bool isConnected() override;

	/*!
	 * \brief 订阅行情数据
	 * \param vecSymbols 要订阅的期货代码集合
	 * 
	 * 向YD服务器发送行情订阅请求，支持批量订阅
	 */
	virtual void subscribe(const CodeSet &vecSymbols) override;
	
	/*!
	 * \brief 退订行情数据
	 * \param vecSymbols 要退订的期货代码集合
	 * 
	 * 向YD服务器发送行情退订请求
	 */
	virtual void unsubscribe(const CodeSet &vecSymbols) override;

	/*!
	 * \brief 注册行情回调接口
	 * \param listener 行情数据回调接口指针
	 * 
	 * 注册行情数据处理回调接口，用于接收处理后的期货行情数据
	 */
	virtual void registerSpi(IParserSpi* listener) override;



private:
	/*!
	 * \brief 执行登录操作
	 * 
	 * 向YD服务器发起登录请求，使用配置的用户名和密码
	 */
	void DoLogin();
	
	/*!
	 * \brief 执行行情数据订阅
	 * 
	 * 向YD服务器发送批量期货行情订阅请求
	 */
	void DoSubscribe();


private:
	uint32_t			m_uTradingDate;		///< 当前交易日期
	YDApi*				m_pUserAPI;			///< YD行情API指针
	bool				m_bApiInited;		///< API是否已初始化完成标志

	std::string			m_strCfgFile;		///< YD配置文件路径
	std::string			m_strUserID;		///< 用户名
	std::string			m_strPassword;		///< 密码

	CodeSet				m_filterSubs;		///< 待订阅期货代码集合

	IParserSpi*			m_sink;				///< 行情数据回调接口指针
	IBaseDataMgr*		m_pBaseDataMgr;		///< 基础数据管理器指针

	DllHandle			m_hInstYD;			///< YD动态库句柄
	typedef YDApi* (*YDCreator)(const char *);	///< YD API创建函数类型定义
	YDCreator			m_funcCreator;		///< YD API创建函数指针
};

